home *** CD-ROM | disk | FTP | other *** search
- #include "dialup.h"
-
- extern BPTR mystderr;
- extern const UBYTE *prgname;
- extern struct IOExtSer *serialIOReq;
- extern struct timerequest *timereq;
- extern BPTR repfile;
- extern UBYTE *rxbuffer;
- extern LONG arg[];
- extern struct argspec argtab[];
-
- BOOL
- take( UBYTE *varbuf )
- {
- UBYTE rgcnt;
-
- if ( *(UBYTE *)arg[A_MSC] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem config (usually a RESET) */
- if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ); /* ignore DTR ? */
-
- /* wait for A_RGS rings without timeout */
- do
- for(rgcnt = 0; rgcnt < *((LONG *)arg[A_RGS]); rgcnt++)
- if ( !expectFromSer( (UBYTE *)arg[A_MRG], *((LONG *)arg[A_RGS]) > 0 && rgcnt == 0 ? 0x7FFFFFFF : 3) )
- break;
- while ( rgcnt < *((LONG *)arg[A_RGS]) && !strstr(rxbuffer, BREAKSTR) ); /* count again, if timeout (not enough rings) but no user break */
-
- VERIFY ( !strstr(rxbuffer, BREAKSTR) );
- VERIFY ( sendEx( (UBYTE *)arg[A_MOH], (UBYTE *)arg[A_MAC], *(LONG *)arg[A_MCT] ) ); /* take call */
- VERIFY ( checkconnect(varbuf) );
-
- _OK_;
- }
-
-
- BOOL
- connect(UBYTE *varbuf)
- {
- UBYTE PNidx = 0;
- UBYTE lastPNidx = 0;
- UBYTE **PNA;
-
- PNA = (UBYTE **)arg[A_PN];
-
- if ( *(UBYTE *)arg[A_MSC] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem config (usually a RESET) */
- if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ); /* ignore DTR ? */
-
- loop /* redial loop */
- {
- if ( !arg[A_NRC] || arg[A_AA] ) /* reconnect or autoanswer ? */
- {
- sprintf(varbuf, (UBYTE *)arg[A_MAAC], *((LONG *)arg[A_RGS]) );
- VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
- };
-
- /* dial or enter local analog loopback: */
- if ( arg[A_TEST] ) sprintf(varbuf, "%s", (UBYTE *)arg[A_MTC]);
- else if ( *PNA[PNidx] == '!' ) sprintf(varbuf, "%s", PNA[PNidx] + 1 );
- else if ( ABBREV( PNA[PNidx], "AT" ) ) sprintf(varbuf, "%s", PNA[PNidx] );
- else sprintf(varbuf, "ATD%s", PNA[PNidx] );
-
- VERIFY ( sendLine( varbuf ) );
- sprintf(varbuf, "%s|%s|%s|%s", arg[A_MLB], arg[A_MNC], arg[A_MAC], arg[A_MLD]);
- VERIFY ( expectFromSer( varbuf, arg[A_TEST] ? 5 : *(LONG *)arg[A_MCT] ) );
-
- if ( ! sStrMatch(rxbuffer, (UBYTE *)arg[A_MLB], varbuf ) )
- break; /* Do not redial if anything else than BUSY */
-
- DisplayBeep(NULL);
- /* switch to next number */
- if ( !PNA[++PNidx] )
- {
- PNidx = 0;
- if ( *(LONG *)arg[A_RDD] == 0 ) _FAIL_; /* no redial of the nuber(s) at all! */
- };
-
- if ( !arg[A_NRC] || arg[A_AA] ) /* reconnect or autoanswer ? */
- { /* set modem to not auto answer during wait: */
- sprintf(varbuf, (UBYTE *)arg[A_MAAC], 0 );
- VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
- };
-
- if ( strcmp(PNA[lastPNidx], PNA[PNidx]) == 0 || PNidx == 0) /* same number or first one again? Then wait a bit. */
- VERIFY ( expectFromSer( NULL, *(LONG *)arg[A_RDD] ) );
- lastPNidx = PNidx;
- };
-
- /* What did modem say: */
- if ( sStrMatch(rxbuffer, (UBYTE *)arg[A_MLD], varbuf ) )
- {
- msg("Sorry! Modem doesn't get a dialtone.");
- _FAIL_;
- }
- else
- VERIFY ( checkconnect( varbuf ) );
-
- if ( arg[A_WBW] && *(LONG *)arg[A_WBW] > 0 ) expectFromSer( NULL, *(LONG *)arg[A_WBW] );
-
- if ( arg[A_WUS] && *((UBYTE *)arg[A_WUS]) ) VERIFY ( sendToSer( (UBYTE *)arg[A_WUS] ) );
-
- if ( arg[A_LIP] && *((UBYTE *)arg[A_LIP]) )
- {
- /* handle login prompt */
- if ( arg[A_TEST] )
- {
- sprintf(varbuf, "\n\n**TEST: %s", arg[A_LIP] == argtab[A_LIP].deflt ? "Login:" : (UBYTE *)arg[A_LIP]);
- VERIFY ( sendToSer( varbuf ) );
- };
- VERIFY ( exSend( (UBYTE *)arg[A_LIP], *((LONG *)arg[A_LTO]), (UBYTE *)arg[A_LIN] ) );
- };
-
- /* handle password prompt */
- if ( arg[A_PWP] && *((UBYTE *)arg[A_PWP]) )
- {
- if ( arg[A_TEST] )
- {
- sprintf(varbuf, "\n\n**TEST: %s", arg[A_PWP] == argtab[A_PWP].deflt ? "Password:" : (UBYTE *)arg[A_PWP]);
- VERIFY ( sendToSer( varbuf) );
- };
- VERIFY ( exSend( (UBYTE *)arg[A_PWP], 10, (UBYTE *)arg[A_PW] ) );
- };
-
- /* handle snd login prompt */
- if ( arg[A_SLIN] && *((UBYTE *)arg[A_SLIN]) )
- {
- if ( arg[A_TEST] )
- {
- sprintf(varbuf, "\n\n**TEST: %s", arg[A_SLIP] == argtab[A_SLIP].deflt ? "2. Login:" : (UBYTE *)arg[A_SLIP]);
- VERIFY ( sendToSer( varbuf) );
- };
- VERIFY ( exSend( (UBYTE *)arg[A_SLIP], *((LONG *)arg[A_LTO]), (UBYTE *)arg[A_SLIN] ) );
- };
-
- /* handle snd pw prompt */
- if ( arg[A_SPW] && *((UBYTE *)arg[A_SPW]) )
- {
- if ( arg[A_TEST] )
- {
- sprintf(varbuf, "\n\n**TEST: %s", arg[A_SPWP] == argtab[A_SPWP].deflt ? "2. Password:" : (UBYTE *)arg[A_SPWP]);
- VERIFY ( sendToSer( varbuf) );
- };
- VERIFY ( exSend( (UBYTE *)arg[A_SPWP], 10, (UBYTE *)arg[A_SPW] ) );
- };
-
- /* check remote response for successful login: */
- if ( arg[A_LOK] && *((UBYTE *)arg[A_LOK]) )
- {
- if ( arg[A_TEST] )
- {
- sprintf(varbuf, "\n\n**TEST: %s", (UBYTE *)arg[A_LOK]);
- VERIFY ( sendToSer( varbuf) );
- };
- VERIFY ( expectFromSer( (UBYTE *)arg[A_LOK], *((LONG *)arg[A_LOT]) ) );
-
- if ( repfile ) Write(repfile, WS("\n"));
- };
-
- _OK_;
- }
-
- BOOL
- hangup(UBYTE *varbuf)
- {
- if ( carrier() )
- {
- VERIFY ( commandmode(varbuf) );
- VERIFY ( dropline(varbuf) );
- }
- else
- {
- VERIFY ( sendEx( (UBYTE *)arg[A_MRC], "?*\r", 3) )
- Delay(25);
- }
-
- if ( arg[A_AA])
- {
- if ( arg[A_MSC] && *(UBYTE *)arg[A_MSC] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem *connect* config (usually a RESET) */
- sprintf(varbuf, (UBYTE *)arg[A_MAAC], *(LONG *)arg[A_RGS] ); /* modem autoanswer */
- VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
- if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ) ; /* ignore DTR */
- }
- else
- {
- if ( arg[A_MSC] && *(UBYTE *)arg[A_MSH] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSH], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem hangup config (usually a RESET) */
- if ( !arg[A_NRC] )
- {
- sprintf(varbuf, (UBYTE *)arg[A_MAAC], 0 ); /* set modem to not auto answer: */
- VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
- }
- if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D2", (UBYTE *)arg[A_MOK], 2 ) ); /* honor DTR again: */
- }
-
- _OK_;
- }
-
- BOOL
- commandmode(UBYTE *varbuf)
- {
- BPTR temp = repfile;
-
- Delay(50); /* send +++ : */
- VERIFY ( sendToSer( (UBYTE *)arg[A_MOC] ) );
- sprintf(varbuf, "%s|%s", (UBYTE *)arg[A_MOK], arg[A_MNC]);
- repfile = NULL;
- if ( !expectFromSer( (UBYTE *) varbuf, 3 ) )
- {
- repfile = temp;
- VERIFY ( sendEx( (UBYTE *)arg[A_MRC], (UBYTE *)arg[A_MOK], 2 ) ); /* maybe already offline ? */
- }
- else repfile = temp;
- _OK_;
- }
-
- BOOL
- dropline(UBYTE *varbuf)
- {
- if ( !arg[A_TEST] ) /* hangup line (ATH0) */
- VERIFY ( sendEx( (UBYTE *)arg[A_MHC], (UBYTE *)arg[A_MOK], 2 ) )
- else
- {
- sprintf( varbuf, "%s|%s", (UBYTE *)arg[A_MOK], arg[A_MNC]);
- VERIFY ( sendEx( (UBYTE *)arg[A_MTO], varbuf, 2 ) );
- };
-
- _OK_;
- }
-
-
- BOOL
- query(UBYTE *varbuf)
- {
- BOOL connected = carrier();
-
- if ( connected ) VERIFY ( commandmode(varbuf) );
- VERIFY ( sendEx( (UBYTE *)arg[A_MQC], (UBYTE *)arg[A_MOK], 8 ) );
- if ( connected ) VERIFY ( sendEx( (UBYTE *)arg[A_MLC], (UBYTE *)arg[A_MAC], 2 ) );
-
- _OK_;
- }
-
-
- BOOL
- checkconnect(UBYTE *buf)
- {
- UBYTE *anycon;
-
- if ( !(anycon = sStrMatch(rxbuffer, (UBYTE *)arg[A_MAC], buf ) ) )
- {
- msg(rxbuffer);
- _FAIL_;
- }
- else
- {
- if ( arg[A_CS] && !sStrMatch(rxbuffer, (UBYTE *)arg[A_CS], buf) )
- msg("Modem handshake result:\n %s", anycon);
- _OK_;
- };
- }
-
-